Crate serde_ignored

source ·
Expand description

githubcrates-iodocs-rs


Find out about keys that are ignored when deserializing data. This crate provides a wrapper that works with any existing Serde Deserializer and invokes a callback on every ignored field.

You can use this to warn users about extraneous keys in a config file, for example.

Note that if you want unrecognized fields to be an error, consider using the #[serde(deny_unknown_fields)] attribute instead.

Example

use serde::Deserialize;
use std::collections::{BTreeSet as Set, BTreeMap as Map};

#[derive(Debug, PartialEq, Deserialize)]
struct Package {
    name: String,
    dependencies: Map<String, Dependency>,
}

#[derive(Debug, PartialEq, Deserialize)]
struct Dependency {
    version: String,
}

let j = r#"{
    "name": "demo",
    "dependencies": {
        "serde": {
            "version": "1.0",
            "typo1": ""
        }
    },
    "typo2": {
        "inner": ""
    },
    "typo3": {}
}"#;

// Some Deserializer.
let jd = &mut serde_json::Deserializer::from_str(j);

// We will build a set of paths to the unused elements.
let mut unused = Set::new();

let p: Package = serde_ignored::deserialize(jd, |path| {
    unused.insert(path.to_string());
})?;

assert_eq!(p, Package {
    name: "demo".to_owned(),
    dependencies: {
        let mut map = Map::new();
        map.insert("serde".to_owned(), Dependency {
            version: "1.0".to_owned(),
        });
        map
    },
});

assert_eq!(unused, {
    let mut expected = Set::new();
    expected.insert("dependencies.serde.typo1".to_owned());
    expected.insert("typo2".to_owned());
    expected.insert("typo3".to_owned());
    expected
});

Structs

  • Deserializer adapter that invokes a callback with the path to every unused field of the input.

Enums

  • Path to the current value in the input, like dependencies.serde.typo1.

Functions

  • Entry point. See crate documentation for an example.